package br.gov.ibama.client;

import br.gov.ibama.client.comum.CadeiaDeExecucao;
import br.gov.ibama.client.comum.ConfiguradorDeTelaAdministrador;
import br.gov.ibama.client.comum.ConfiguradorDeTelaAluno;
import br.gov.ibama.client.comum.ConfiguradorDeTelaProfessor;
import br.gov.ibama.shared.Usuario;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DecoratedPopupPanel;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

/**
 * 
 * @author bberna1
 *
 */
public class SGE implements EntryPoint {
	
	private static final String LOGO_IBAMA = "logo_prefeitura.jpg";
	private static final String ALTURA_LOGO = "100px";
	private static final String LARGURA_LOGO = "80px";
	private static final int ALTURA = 300;
	private static final int LARGURA = 350;
	
	public static final AuthServiceAsync authService = GWT
			.create(AuthService.class);
	
	/**
	 * 
	 */
	public void onModuleLoad() {

		authService.getUsuarioDaSessao(new AsyncCallback<Usuario>() {
			
			@Override
			public void onSuccess(Usuario usuario) {
				if(usuario != null && usuario.getLogin() != null && !usuario.getLogin().isEmpty()) {
					montaTelaPrincipal(usuario);

				} else {
					final HLayout layoutmain = new HLayout();
					final VLayout verticalLayout = new VLayout();
					verticalLayout.setStyleName("margem-30-top");
					verticalLayout.setPadding(20);
					
					final DialogBox janelaLogin = new DialogBox();
										
					VerticalPanel formularioLogin = new VerticalPanel();
					formularioLogin.setSpacing(2);
					janelaLogin.setWidget(formularioLogin);

					Label llogin = new Label("Login:");
					llogin.setStyleName("fonte-label-login");
					formularioLogin.add(llogin);
					final TextBox campoLogin = new TextBox();
					campoLogin.setFocus(true);
					campoLogin.setWidth("200px");
					formularioLogin.add(campoLogin);
					Label lsenha = new Label("Senha:");
					lsenha.setStyleName("fonte-label-login");
					formularioLogin.add(lsenha);
					final PasswordTextBox campoSenha = new PasswordTextBox();
					campoSenha.setWidth("200px");
					formularioLogin.add(campoSenha);
					
					Button botaoLogin = new Button("Entrar", new ClickHandler() {
						public void onClick(ClickEvent event) {
							
							final Usuario usuario = new Usuario();
							usuario.setLogin(campoLogin.getValue());
							usuario.setSenha(campoSenha.getValue());
							
							authService.logar(usuario, new AsyncCallback<Void>() {

										@Override
										public void onSuccess(Void result) {
											verticalLayout.hide();
											janelaLogin.clear();
											authService.getUsuarioDaSessao(new AsyncCallback<Usuario>() {
												@Override
												public void onSuccess(Usuario usuario) {
													if(usuario != null && usuario.getLogin() != null && !usuario.getLogin().isEmpty()) {
														montaTelaPrincipal(usuario);
													}
												}
												
												@Override
												public void onFailure(Throwable caught) {
													DialogBox mensagem = new DialogBox();
													mensagem.setText("Ops! Erro inesperado");			
													mensagem.setWidget(new Label("Por favor, entre em contato com o suporte"));
													mensagem.show();
													mensagem.center();
													mensagem.setAutoHideEnabled(true);
												}
											});
										}

										@Override
										public void onFailure(Throwable caught) {
											DecoratedPopupPanel simplePopup = new DecoratedPopupPanel(
													true);
											String msg = "<b><font color=\"red\" type=\"Arial\">"+caught.getLocalizedMessage()+"</font></b>";
											simplePopup.setWidget(new HTML(msg));
											simplePopup.setModal(true);
											simplePopup.setStyleName("align=\"center\"");
											simplePopup.showRelativeTo(janelaLogin);
										}
									});
						}
					});
					botaoLogin.setStyleName("botao-login");
					formularioLogin.add(botaoLogin);
					formularioLogin.setStyleName("padding-50-left");
					janelaLogin.setModal(true);
					janelaLogin.center();		
					
					verticalLayout.setWidth(LARGURA);
					verticalLayout.setHeight(ALTURA);
					verticalLayout.setBorder("2px solid #008100");
					verticalLayout.setAlign(Alignment.CENTER);
					verticalLayout.setAlign(VerticalAlignment.CENTER);
					
					Img logo = new Img(LOGO_IBAMA);
					logo.setSize(LARGURA_LOGO, ALTURA_LOGO);
					logo.setAlign(Alignment.CENTER);
					logo.setValign(VerticalAlignment.CENTER);
					logo.setLeft(500);
									
					HLayout layoutLogotipo = new HLayout();
					layoutLogotipo.setAlign(Alignment.CENTER);
					layoutLogotipo.setWidth100();
					layoutLogotipo.addMember(logo);
					
					com.smartgwt.client.widgets.Label titulo = 
							new com.smartgwt.client.widgets.Label("Sistema de Gerenciamento Escolar");
					titulo.setStyleName("fonte-titulo-login");
					titulo.setAlign(Alignment.CENTER);
					
					verticalLayout.addMember(layoutLogotipo);
					verticalLayout.addMember(titulo);
					verticalLayout.addMember(janelaLogin);

					layoutmain.setAlign(Alignment.CENTER);
					layoutmain.setAlign(VerticalAlignment.CENTER);
					layoutmain.setWidth100();
					layoutmain.addMember(verticalLayout);
					layoutmain.show();	
										
				}
			}
			
			@Override
			public void onFailure(Throwable caught) {
				DialogBox mensagem = new DialogBox();
				mensagem.setText("Ops! Erro inesperado");			
				mensagem.setWidget(new Label("Por favor, entre em contato com o suporte"));
				mensagem.show();
				mensagem.center();
				mensagem.setAutoHideEnabled(true);
			}
		});	
	}
	
	public void montaTelaPrincipal(Usuario usuario) {
		CadeiaDeExecucao cadeia = new CadeiaDeExecucao();
		if (usuario.getPerfil() == Usuario.PERFIL_ADMINISTRADOR) {
			cadeia.adiciona(new ConfiguradorDeTelaAdministrador());
		} else if (usuario.getPerfil() == Usuario.PERFIL_PROFESSOR) {
			cadeia.adiciona(new ConfiguradorDeTelaProfessor());
		} else {
			cadeia.adiciona(new ConfiguradorDeTelaAluno());
		}
		cadeia.executa();
	}
}
